/**
 * 给定N、M、X，保证X是偶数，构造矩阵满足：
 * 1. N行*M列
 * 2. 元素和为X
 * 3. 每一行、每一列异或和相等
 * 题目保证N、M不小于4，且X是偶数
 * 与CF917E一样，但题目给了条件提示，更简单
 * 假设X是4的倍数，则分为四份，记作t
 *  t t ...
 *  t t ...
 *  .......
 *  即可满足
 *  如果对4模2的话，可以考虑6个1的矩阵
 *  t t 0 0
 *  t t 1 1
 *  0 1 0 1
 *  0 1 1 0
 *  刚好可以满足。所以只有X为2时无法构造
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using vpii = vector<pii>;

template<typename T>
void input(vector<T>&v, int n){
    v.assign(n + 1, {});
    for(int i=1;i<=n;++i)cin>>v[i];
    return;
}

int N, M, X;
vector<vi> A;

bool check(){
    llt s = 0LL;
    for(const auto & v : A) s += accumulate(v.begin(), v.end(), 0LL);
    if(X != s) return false;

    int t = 0;
    for(auto i : A[0]) t ^= i;

    for(const auto & v : A){
        int tmp = 0;
        for(auto i : v) tmp ^= i;
        if(t != tmp) return false;
    }

    for(int j=0;j<M;++j){
        int tmp = 0;
        for(int i=0;i<N;++i) tmp ^= A[i][j];
        if(t != tmp) return false;
    }
    return true;
}


bool proc(){
    A.assign(N, vi(M, 0));
    if(X % 4 == 0){
        auto t = X / 4;
        A[0][0] = A[0][1] = A[1][0] = A[1][1] = t;
        return true;
    }    
    if(X >= 6){
        int t = X / 4 - 1;
        A[0][0] = A[0][1] = A[1][0] = A[1][1] = t;
        A[1][2] = A[1][3] = A[2][1] = A[2][3] = A[3][2] = A[3][1] = 1;
        return true;
    }
    return false;
}

void work(){
    cin >> N >> M >> X;

    if(not proc()) return (void)(cout << "-1\n");

    assert(check());

    for(const auto & v : A){
        for(auto i : v) cout << i << " ";
        cout << "\n";
    }
     
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) {
		work();
	}
    return 0;
}